package top.chukongxiang.project.base.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.*;
import java.util.stream.Collectors;

public class JsonUtils {

    /**
     * 对json数组排序，
     * @param jsonArr
     * @param sortKey 排序关键字
     * @param is_desc is_desc-false升序列  is_desc-true降序 (排序字段为字符串)
     * @return
     */
    public static JSONArray jsonArraySort(JSONArray jsonArr, String sortKey, boolean is_desc) {
        if (jsonArr==null) {
            return null;
        }
        //存放排序结果json数组
        JSONArray sortedJsonArray = new JSONArray();
        //用于排序的list
        List<JSONObject> jsonValues = new ArrayList<>();
        //将参数json数组每一项取出，放入list
        jsonArr.forEach(obj -> jsonValues.add((JSONObject.parseObject(JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue)))));
        //快速排序，重写compare方法，完成按指定字段比较，完成排序
        Collections.sort(jsonValues, new Comparator<JSONObject>() {
            //排序字段
            private  final String KEY_NAME = sortKey;
            //重写compare方法
            @Override
            public int compare(JSONObject a, JSONObject b) {
                String valA = new String();
                String valB = new String();
                try {
                    valA = a.getString(KEY_NAME);
                    valB = b.getString(KEY_NAME);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                //是升序还是降序
                if (is_desc){
                    return -valA.compareTo(valB);
                } else {
                    return -valB.compareTo(valA);
                }

            }
        });
        //将排序后结果放入结果jsonArray
        jsonValues.forEach(sortedJsonArray::add);
        return sortedJsonArray;
    }

    //比较方法是equals
    public static boolean hasEqualsJsonKey(JSONArray jsonArray, Object jsonKey){
        if (jsonArray==null || jsonArray.size()==0) {
            return false;
        }
        //计算有这个key的jsonobject有几个
        List<Object> jsonKeysValueList = jsonArray.stream().filter(obj -> ((obj instanceof JSONObject) ? ((JSONObject) obj) : JSONObject.parseObject(JSON.toJSONString(obj))).get(jsonKey) != null).collect(Collectors.toList());
        int count = jsonKeysValueList.size();
        //去重复后json的key是jsonKey的value
        Set<Object> jsonKeysValueSet = jsonKeysValueList.stream().collect(Collectors.toSet());
        //相同的时候代表，jsonKey对应的value全都不相同
        //不相同：jsonKey对应的value有相同
        return count!=jsonKeysValueSet.size();
    }


}
